#!/usr/bin/env bash

# ohos-tool补全
function __complete_ohos-tool() {
    local cur prev
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    if [ $COMP_CWORD -eq 1 ]; then
        local list
        local OHOS_DOCKER_USE=${OHOS_DOCKER_USE:-1}
        if [ $OHOS_DOCKER_USE = 1 ]; then
            list="$(docker container ls 2>/dev/null)"
            if [ $? != 0 ]; then
                false || report "docker container ls执行时失败"
                docker container ls
                exit 1
            fi
            list=$(echo "$list" | awk '{if (NR>1) {print $NF}}')
        else
            list=$(declare | egrep "^ohos\w*=" | sed 's/=.*//g')
        fi

        local useful="$(echo "$list" | while read str; do
            eval "sstr=\"\${$str}\""
            if [ -d "$sstr" ]; then
                echo -en " ${str}"
            fi
        done)"
        COMPREPLY="$(compgen -W "$useful" -- ${cur})"
        return 0
    fi

    if [ $COMP_CWORD -eq 2 ]; then
        local list
        list=$(${COMP_WORDS[@]} | sed "s/\x29.*//")
        COMPREPLY="$(compgen -W "$list" -- ${cur})"
        return 0
    fi
    return 1

    local enter='
' # \n

    if [ $COMP_CWORD -gt 2 ]; then
        case ${prev} in
            --*)
                local list="$(${COMP_WORDS[0]} ${COMP_WORDS[1]} --)"
                local str useful complete_opt
                echo "$list" | while read str; do
                    local opt="${str/)*/}"
                    local comment="${str/*)/}"
                    [ "${prev}" != "$opt" ] && continue

                    while [ "$comment" != "" ]; do
                        local first=$(echo $comment | awk '{print $1}')
                        comment="$(echo $comment | awk '{$1=""; print $0}')"

                        case $first in
                            @01)
                                useful="$useful 0 1"
                                ;;
                            @*)
                                local word=${first:1}
                                complete_opt="$complete_opt -A $word"
                                ;;
                        esac
                    done
                done
                COMPREPLY="$(compgen -W "$useful" $complete_opt -- ${cur})"
                return 0
                ;;
            *)
                local list="$(${COMP_WORDS[0]} ${COMP_WORDS[1]} -)"
                list="${list}${enter}$(${COMP_WORDS[0]} ${COMP_WORDS[1]} --)"

                local part1=${COMP_WORDS[2]/@*/}
                local part2=${COMP_WORDS[2]/*@/}
                local str useful
                echo "$list" | while read str; do
                    local opt="${str/)*/}"
                    local comment="${str/*)/}"
                    while [ "$comment" != "" ]; do
                        local first=$(echo $comment | awk '{print $1}')
                        comment="$(echo $comment | awk '{$1=""; print $0}')"

                        case $first in
                            \#*)
                                local word=${first:1}
                                if [ "$word" != "" ] && [[ $part1 = $word ]]; then
                                    useful="$useful ${opt}"
                                    break
                                fi
                                ;;
                            ^*)
                                local word=${first:1}
                                if [ "$word" != "" ] && [[ $part2 = $word ]]; then
                                    useful="$useful ${opt}"
                                    break
                                fi
                                ;;
                        esac
                    done
                done
                COMPREPLY="$(compgen -W "${useful:1}" -- ${cur})"
                return 0
                ;;
        esac
    fi

    # alias               起别名。也可以用 -a 指定
    # arrayvar            数组变量名
    # binding Readline    按键关联
    # builtin shell       内建命令的名称。也可以用 -b 指定
    # command             命令名。也可以用 -c 指定
    # directory           目录名。也可以用 -d 指定
    # disabled            被禁用的内建命令名称
    # enabled             启用的内建命令名称
    # export              被导出的 shell 变量名称。也可以用 -e 指定
    # file                文件名。也可以用 -f 指定
    # function            shell 函数的名称
    # group               组名。也可以用 -g 指定
    # helptopic           内建命令 help 接受的帮助主题
    # hostname            主机名，从环境变量 HOSTFILE 指定的文件中得到
    # job                 作业名，如果作业控制被激活的话。也可以用 -j 指定
    # keyword             shell 保留字。也可以用 -k 指定
    # running             正在运行的作业名，如果作业控制被激活的话
    # service             服务名。也可以用 -s 指定
    # setopt              内建命令 set 的 -o 选项的有效参数
    # shopt               内建命令 shopt 接受的 shell 选项名
    # signal              信号名
    # stopped             停止的作业名，如果作业控制被激活的话
    # user                用户名。也可以用 -u 指定
    # variable            shell 变量的名称。也可以用 -v 指定
}

complete -F __complete_ohos-tool ohos-tool
